home *** CD-ROM | disk | FTP | other *** search
/ Gamer's Paradise: Czech / Hracuv-raj_Ceske-hry_cd2.bin / Honzovy Šachy 1.0 / zdrojaky / globruti.c < prev    next >
Encoding:
C/C++ Source or Header  |  2001-07-28  |  17.2 KB  |  523 lines

  1. /*********************************************************/
  2. /* globruti.c - globalni sachove rutiny                  */
  3. /* napr. zahrani a vraceni tahu v partii                 */ 
  4. /* 31.12. 2000 Jan Nemec                                 */
  5. /*********************************************************/
  6. #include <stdarg.h>
  7. #include <stdlib.h>
  8. #include "volby.h"
  9. #include "cotyvar.h"
  10. #include "chyba.h"
  11. #include "globruti.h"
  12. #include "myslitel.h"
  13. #include "generato.h"
  14. #include "partie.h"
  15. #include "hashtab.h"
  16. #include "lokruti.h"
  17. #include "strtah.h"
  18. #if Typ_Produktu==Win32_Program
  19. char NazvyVysledku[8][38]={
  20.  "Hrajeme dßl",
  21.  "Bφl² dostal mat",
  22.  "╚ern² dostal mat",
  23.  "Remφza trojnßsobn²m opakovßnφm pozice",
  24.  "Remφza dφky pravidlu padesßti tah∙",
  25.  "Remφza, bφl² dostal pat",
  26.  "Remφza, Φern² dostal pat",
  27.  "Remφza, nenφ matφcφ materißl"
  28. };
  29. /*Pouze pro Windows*/
  30. #endif
  31. void ZjistiTypKoncePartie(TUloha *uloha)
  32. /************************************************************************
  33.  * Jak dopadla partie ? Nastavφ sprßvn∞ uloha->KonecPartie              *
  34.  ************************************************************************/
  35.  {int i,bbs,bcs,cbs,ccs,cj,bj;
  36.  uloha->KonecPartie=0;
  37.  NalezTahy(uloha);
  38.  JenPripustne(uloha);
  39.  if(uloha->zasobnik.hranice[1]==0)
  40.   {
  41.    if(Sach(uloha->pozice.bily,uloha->pozice.sch))
  42.     uloha->KonecPartie=uloha->pozice.bily ? BilyVMatu : CernyVMatu;
  43.    else
  44.     uloha->KonecPartie=uloha->pozice.bily ? RemisBilyVPatu : RemisCernyVPatu;
  45.   }
  46.  else
  47.  switch(Remiza50Nebo3(uloha))
  48.   {
  49.   case 50:uloha->KonecPartie=Remis50;break;
  50.   case 3: uloha->KonecPartie=Remis3;break;
  51.  }
  52.  if(uloha->KonecPartie)return;
  53.  bbs=bcs=cbs=ccs=cj=bj=0;
  54.  for(i=a1;i<=h8;i++){
  55.      switch(uloha->pozice.sch[i]){
  56.      case 1:return;
  57.      case 4:return;
  58.      case 5:return;
  59.      case -1:return;
  60.      case -4:return;
  61.      case -5:return;
  62.      case 2:bj++;break;
  63.      case -2:cj++;break;
  64.      case 3:if(((i/10)+(i%10))&1)bbs++;else bcs++;break;
  65.      case -3:if(((i/10)+(i%10))&1)cbs++;else ccs++;break;
  66.      }
  67.  }
  68.  if((i=bbs+bcs+cbs+ccs+cj+bj)<=1||i==bbs+cbs||i==bcs+ccs)
  69.      uloha->KonecPartie=RemisMaloMaterialu;
  70.  /*Je-li zadna nebo jen jedna lehka figura nebo
  71.   jsou na sachovnici jen strelci jedne barvy, nebude mat*/
  72. }
  73.  
  74. void JenPripustne(TUloha *uloha)
  75. /*************************************************************************
  76.  *  JenPripustne - Vynda z prvni dle pos volne (ale v praxi obsazene)    *
  77.  *   urovne zasobniku nepripustne tahy tj. ty vedouci k sachu.           *
  78.  *  Ty tahy tam uz musi byt.                                             *
  79.  *  Pomerne pomale, neuzivat v rekurzi propoctu.                         *
  80.  *  Nastavi pocatek druhe prazdne urovne (snizi nebo necha)              *
  81.  *************************************************************************/
  82. {TTah1 *pz,*pdo,*pkonec; /*pointery do zasobniku tahu
  83.  pz - odkud beru testovane tahy
  84.  pdo - kam je davam
  85.  pkonec - prvni volne misto na zasobniku pred cistkou*/
  86.  
  87.  pdo=pz=uloha->zasobnik.tahy+ /* najedu ukazately na pocatek tahu
  88.  posledni urovne v zasobniku*/
  89.    uloha->zasobnik.hranice[uloha->zasobnik.pos];
  90.  pkonec=uloha->zasobnik.tahy+ /* najedu pkoncem pocatek (neexistujicich) tahu
  91.  prvni nevyuzite urovne v zasobniku*/
  92.    uloha->zasobnik.hranice[uloha->zasobnik.pos+1];
  93.  UlozStav(uloha);
  94.  while (pz<pkonec)
  95.  {JednoTahni(pz->data,uloha);
  96.   if(!Sach(!uloha->pozice.bily,uloha->pozice.sch)) *pdo++=*pz;
  97.   JednoTahniZpet(pz->data,uloha);pz++;
  98.  }
  99.  uloha->zasobnik.hranice[uloha->zasobnik.pos+1]=(s16)(pdo-uloha->zasobnik.tahy);
  100.   /* uprava te horni hranice prvni volne skupiny zasobniku
  101.      (mohl jsem neco vyskrtat) */
  102. }
  103.  
  104. bool KorektniTah(u16 tah, TUloha *uloha)
  105. /*************************************************************************/
  106. /*  KorektniTah - je to pripustny tah ?                                  */
  107. /*  Zvedne uroven zasobniku, nalezne tahy, vyskrta nepripustne,          */
  108. /*  pokusi se tam ten tah najit a nakonec snizi uroven zasobniku zpet.   */
  109. /*************************************************************************/
  110. {s16 i;
  111.  
  112.  uloha->zasobnik.pos++;
  113.  NalezTahy(uloha);
  114.  JenPripustne(uloha);
  115.  for(i=uloha->zasobnik.hranice[uloha->zasobnik.pos];
  116.      i<uloha->zasobnik.hranice[uloha->zasobnik.pos+1];i++)
  117.   if(tah==uloha->zasobnik.tahy[i].data) {uloha->zasobnik.pos--;return true;}
  118.  
  119.  uloha->zasobnik.pos--;
  120.  return false;
  121. }
  122.  
  123. bool KTNehledej(u16 tah, TUloha *uloha)
  124. /*************************************************************************/
  125. /*  KTNehledej -  Analogie KorektiTah, jen u₧ vÜe musφ b²t na zßsobnφku. */
  126. /*  Ze zßsobnφku pouze Φte.                                                 */
  127. /*************************************************************************/
  128. {s16 i;
  129.  
  130.  for(i=uloha->zasobnik.hranice[uloha->zasobnik.pos];
  131.      i<uloha->zasobnik.hranice[uloha->zasobnik.pos+1];i++)
  132.   if(tah==uloha->zasobnik.tahy[i].data) return true;
  133.  return false;
  134. }
  135. void GlobTahni(bool TestKonce, TUloha *uloha, bool useknout, ...)
  136. /*************************************************************************
  137.  *   GlobTahni - Tah v partii (nikoliv v propoctu)                       *
  138.  *   na zasobnik ani nesahne                                             *
  139.  *   je-li useknout true, je dalsim parametrem unsigned - tah, ktery ze se to *
  140.  *    ma zahrat tah - a tim se taky preplacne pripadny ocas partie       *
  141.  *   je-li useknout false, nejsou zadne dalsi parametry, jde o           *
  142.  *    znovuzahrani vraceneho tahu - ten se nacte z partie, ta se posune  *
  143.  *    o 1 doprava, ocas se nemaze                                        *
  144.  Tahy jsou unsigned a ne u16 kvuli nesmyslne iso norme
  145.  (u16 by byla chyba pri prekladu !!!)
  146.  *************************************************************************/
  147.  {s8 odkud;
  148.   s8 kam;
  149.   va_list ptr;
  150.   TPartData data;
  151.   u16 tah;
  152.   unsigned tah32;
  153.  
  154.   data.mimoch=(u8)uloha->pozice.mimoch;
  155.   data.roch=uloha->pozice.roch;
  156.   data.brani=0; /*pripady, kdy by to bylo blbe se pak opravi*/
  157.   data.zmena=0;
  158.  
  159.   if (useknout)
  160.   {va_start(ptr,useknout);
  161.    tah32=va_arg(ptr,unsigned);
  162.    tah=(u16)tah32;
  163.    va_end(ptr);
  164. #ifdef STRINGTAH
  165.    NalezTahy(uloha);
  166.    TahToStr(tah,uloha,data.nazev);
  167. #endif
  168.   }
  169.   else
  170.    tah=uloha->prt->p->data.t;
  171.   data.t=tah;
  172.  
  173.   uloha->pozice.mimoch=0; /*Vetsina tahu neni pescem o 2, pokud ano, osetri se*/
  174.   uloha->pozice.bily=!uloha->pozice.bily;
  175.   if(!(tah>>15)) /* Normalni tah*/
  176.    {kam=(s8)(tah&127);
  177.     odkud=(s8)(tah>>7);
  178.     if(abs(uloha->pozice.sch[odkud])==1)data.zmena=1;
  179.     if(/* bud cerny tahne pescem o 2*/
  180.         odkud-kam==20 && uloha->pozice.sch[odkud]==-1
  181.         /* a bily pesec ciha */
  182.     && (uloha->pozice.sch[kam+1]==1 || uloha->pozice.sch[kam-1]==1)
  183.     /* nebo bily tahne pescem o 2 */
  184.     || odkud-kam==-20 && uloha->pozice.sch[odkud]==1
  185.         /* a cerny pesec ciha */
  186.     && (uloha->pozice.sch[kam+1]==-1 || uloha->pozice.sch[kam-1]==-1))
  187.       uloha->pozice.mimoch=kam;
  188.  /* Niceni rosad
  189.    Pozn.: nejde dat vsude 'else', protoze napr. Va1xa8 nici obe velke rosady*/
  190.     if (odkud==e1) uloha->pozice.roch&=12; else /* 1100b*/
  191.     if (odkud==e8) uloha->pozice.roch&=3; else /* 0011b*/
  192.   { if (kam==a1 || odkud==a1) uloha->pozice.roch&=13;/*1101b*/
  193.     if (kam==h1 || odkud==h1) uloha->pozice.roch&=14;/*1110b*/
  194.     if (kam==a8 || odkud==a8) uloha->pozice.roch&=7; /*0111b*/
  195.     if (kam==h8 || odkud==h8) uloha->pozice.roch&=11;/*1011b*/
  196.   }
  197.  data.brani=uloha->pozice.sch[kam];
  198.  BeznyTah:; /* sem se skace z konce brani mimochodem*/
  199.  /* zakladni rutina normalniho tahu:*/
  200.  uloha->pozice.sch[kam]=uloha->pozice.sch[odkud];
  201.  uloha->pozice.sch[odkud]=0;
  202.  goto PridejDoPartie;
  203.  }
  204.   /* Nenormalni tah
  205.      Mala bila rosada*/
  206.   if (tah==MBRoch)
  207.    {uloha->pozice.sch[e1]=0;
  208.     uloha->pozice.sch[g1]=6;
  209.     uloha->pozice.sch[h1]=0;
  210.     uloha->pozice.sch[f1]=4;
  211.     uloha->pozice.roch&=12;
  212.     data.brani=0;
  213.     goto PridejDoPartie;}
  214.   /*Velka bila rosada*/
  215.   if (tah==VBRoch)
  216.    {uloha->pozice.sch[e1]=0;
  217.     uloha->pozice.sch[c1]=6;
  218.     uloha->pozice.sch[a1]=0;
  219.     uloha->pozice.sch[d1]=4;
  220.     uloha->pozice.roch&=12;
  221.     data.brani=0;
  222.     goto PridejDoPartie;}
  223.  /*Mala cerna rosada*/
  224.   if (tah==MCRoch)
  225.    {uloha->pozice.sch[e8]=0;
  226.     uloha->pozice.sch[g8]=-6;
  227.     uloha->pozice.sch[h8]=0;
  228.     uloha->pozice.sch[f8]=-4;
  229.     uloha->pozice.roch&=3;
  230.     data.brani=0;
  231.     goto PridejDoPartie;}
  232.   /*Velka cerna rosada*/
  233.   if (tah==VCRoch)
  234.    {uloha->pozice.sch[e8]=0;
  235.     uloha->pozice.sch[c8]=-6;
  236.     uloha->pozice.sch[a8]=0;
  237.     uloha->pozice.sch[d8]=-4;
  238.     uloha->pozice.roch&=3;
  239.     data.brani=0;
  240.     goto PridejDoPartie;}
  241.   /*Promena bileho pesce*/
  242.  if ((tah>>12)==12)
  243.    {data.zmena=1;
  244.    data.brani=uloha->pozice.sch[a8+((tah>>4)&7)];
  245.    uloha->pozice.sch[a7+((tah>>7)&7)]=0;
  246.    uloha->pozice.sch[a8+((tah>>4)&7)]=(s8)(2+((tah>>10)&3));
  247.    if (((tah>>4)&7)==0) /* meni pesce na a8, mohl sezrat vez => rosady...*/
  248.     uloha->pozice.roch&=7; /*0111b*/
  249.    if (((tah>>4)&7)==7) /* meni pesce na h8, mohl sezrat vez => rosady...*/
  250.     uloha->pozice.roch&=11; /*1011b */
  251.     goto PridejDoPartie;
  252.   }
  253.   /*Promena cerneho pesce*/
  254.  if ((tah>>12)==13)
  255.   {data.zmena=1;
  256.    data.brani=uloha->pozice.sch[a1+((tah>>4)&7)];
  257.    uloha->pozice.sch[a2+((tah>>7)&7)]=0;
  258.    uloha->pozice.sch[a1+((tah>>4)&7)]=(s8)-(2+((tah>>10)&3));
  259.    if (((tah>>4)&7)==0) /* meni pesce na a1, mohl sezrat vez => rosady...*/
  260.     uloha->pozice.roch&=13; /*1101b*/
  261.    if (((tah>>4)&7)==7) /* meni pesce na h1, mohl sezrat vez => rosady...*/
  262.     uloha->pozice.roch&=14; /*1110b*/
  263.     goto PridejDoPartie;
  264.   }
  265.  /* Brani mimochodem (nic jineho to uz byt nemuze)*/
  266.  tah&=0x3fff; /* odstraneni prvnich dvou bitu, aby se lepe siftovalo*/
  267.  kam=(s8)(tah&127);
  268.  odkud=(s8)(tah>>7);
  269.  if(odkud<kam)
  270.    {uloha->pozice.sch[kam-10]=0; /* to hraje bily*/
  271.    data.brani=-1;}
  272.  else
  273.   {uloha->pozice.sch[kam+10]=0; /* cerny*/
  274.    data.brani=1;}
  275.  goto BeznyTah; /* zbytek je stejny jako pro normalni tah*/
  276.  PridejDoPartie:;
  277.  if (useknout) {
  278.   data.hashF=HashF(&(uloha->pozice));
  279.   if(data.brani)data.zmena=1;
  280.   PridejTah(&uloha->prt,data);
  281.  }
  282.  else uloha->prt=uloha->prt->p;
  283.  if(TestKonce)ZjistiTypKoncePartie(uloha);
  284. }
  285. void GlobTahniZpet(TUloha *uloha)
  286. /***************************************************************************
  287.  *   GlobTahniZpet - Tahne zpet v partii (Nikoliv v propoctu)              *
  288.  *   Posune se v partii o 1 doleva, ocas nemaze, na zasobnik ani nesahne   *
  289.  ***************************************************************************/
  290.  {register u8 odkud;
  291.   register u8 kam;
  292. /*  u8 hloubka;*/
  293.   u16 data;
  294.  
  295. #if LadeniGlobruti > 10
  296.  if (!uloha->prt || !uloha->prt->l) Chyba("GlobTahniZpet");
  297. #endif
  298.   uloha->KonecPartie=false;
  299.   uloha->pozice.mimoch=uloha->prt->data.mimoch;
  300.   uloha->pozice.roch=uloha->prt->data.roch;
  301.   uloha->pozice.bily=!uloha->pozice.bily;
  302.   data=uloha->prt->data.t;
  303.   uloha->prt=uloha->prt->l;
  304.  
  305.   if(!(data>>15)) /* Normalni tah*/
  306.    {kam=(s8)(data&127);
  307.     odkud=(s8)(data>>7);
  308.  uloha->pozice.sch[odkud]=uloha->pozice.sch[kam];
  309.  uloha->pozice.sch[kam]=uloha->prt->p->data.brani;
  310.  
  311.  return;
  312.  }
  313.   /* Nenormalni tah
  314.      Mala bila rosada*/
  315.   if (data==MBRoch)
  316.    {uloha->pozice.sch[e1]=6;
  317.     uloha->pozice.sch[g1]=0;
  318.     uloha->pozice.sch[h1]=4;
  319.     uloha->pozice.sch[f1]=0;
  320.     return;}
  321.   /*Velka bila rosada*/
  322.   if (data==VBRoch)
  323.    {uloha->pozice.sch[e1]=6;
  324.     uloha->pozice.sch[c1]=0;
  325.     uloha->pozice.sch[a1]=4;
  326.     uloha->pozice.sch[d1]=0;
  327.     return;}
  328.  /*Mala cerna rosada*/
  329.   if (data==MCRoch)
  330.    {uloha->pozice.sch[e8]=-6;
  331.     uloha->pozice.sch[g8]=0;
  332.     uloha->pozice.sch[h8]=-4;
  333.     uloha->pozice.sch[f8]=0;
  334.     return;}
  335.   /*Velka cerna rosada*/
  336.   if (data==VCRoch)
  337.    {uloha->pozice.sch[e8]=-6;
  338.     uloha->pozice.sch[c8]=0;
  339.     uloha->pozice.sch[a8]=-4;
  340.     uloha->pozice.sch[d8]=0;
  341.     return;}
  342.   /*Promena bileho pesce*/
  343.  if ((data>>12)==12)
  344.   {
  345.    uloha->pozice.sch[a7+((data>>7)&7)]=1;
  346.    uloha->pozice.sch[a8+((data>>4)&7)]=uloha->prt->p->data.brani;
  347.    return;
  348.   }
  349.   /*Promena cerneho pesce*/
  350.  if ((data>>12)==13)
  351.   {
  352.    uloha->pozice.sch[a2+((data>>7)&7)]=-1;
  353.    uloha->pozice.sch[a1+((data>>4)&7)]=uloha->prt->p->data.brani;
  354.    return;
  355.   }
  356.  /* Brani mimochodem (nic jiného to uz byt nemuze)*/
  357.  data&=0x3fff; /* odstraneni prvnich dvou bitu, aby se lepe siftovalo*/
  358.  kam=(s8)(data&127);
  359.  odkud=(s8)(data>>7);
  360.  if(odkud<kam)
  361.   {uloha->pozice.sch[kam-10]=-1; /* to hraje bily*/
  362.    uloha->pozice.sch[odkud]=1;}
  363.  else
  364.   {uloha->pozice.sch[kam+10]=1;  /* cerny */
  365.    uloha->pozice.sch[odkud]=-1;}
  366.  uloha->pozice.sch[kam]=0;
  367.  }
  368.  
  369. bool JeTam1(u8 odkud,TUloha *uloha)
  370. /****************************************************/
  371. /* Je mezi nalezenymi tahi nejaky vedouci z odkud ? */
  372. /****************************************************/
  373. {TTah1 *p,*k;
  374.  u16 t;
  375.  
  376.  p=&uloha->zasobnik.tahy[uloha->zasobnik.hranice[uloha->zasobnik.pos]]-1;
  377.  k=&uloha->zasobnik.tahy[uloha->zasobnik.hranice[uloha->zasobnik.pos+1]]-1;
  378.  while(p<k)
  379.   {p++;
  380.   t=p->data;
  381.   if(!(t>>15)) /* Normalni tah*/  if  (odkud==t>>7)  return true; else continue;
  382.   if ((t==MBRoch || t==VBRoch)) if (odkud==e1) return true; else continue;
  383.   if ((t==MCRoch || t==VCRoch)) if (odkud==e8) return true; else continue;
  384.   /*Promena bileho pesce*/
  385.   if ((t>>12)==12) if (odkud == a7+((t>>7)&7)) return true; else continue;
  386.   /*Promena cerneho pesce*/
  387.   if ((t>>12)==13) if (odkud == a2+((t>>7)&7)) return true; else continue;
  388.   /* Brani mimochodem (nic jineho to uz byt nemuze)*/
  389.   if ((t&0x3fff)>>7 == odkud) return true; else continue;
  390.   }
  391.  return false;
  392. }
  393.  
  394. bool JeTam2(u8 odkud,u8 kam,TUloha *uloha)
  395. /***********************************************************/
  396. /* Je mezi nalezenymi tahi nejaky vedouci z odkud do kam ? */
  397. /***********************************************************/
  398. {TTah1 *p,*k;
  399.  u16 t;
  400.  
  401.  p=&uloha->zasobnik.tahy[uloha->zasobnik.hranice[uloha->zasobnik.pos]]-1;
  402.  k=&uloha->zasobnik.tahy[uloha->zasobnik.hranice[uloha->zasobnik.pos+1]]-1;
  403.  while(p<k)
  404.   {p++;
  405.    t=p->data;
  406.  /* Normalni tah*/
  407. if(!(t>>15))  if(kam==(t&127) && odkud==(t>>7)) return true; else continue;
  408. /*RoÜßdy*/
  409. if (t==MBRoch) if(odkud==e1 && kam==g1) return true; else continue;
  410. if (t==VBRoch) if(odkud==e1 && kam==c1) return true; else continue;
  411. if (t==MCRoch) if(odkud==e8 && kam==g8) return true; else continue;
  412. if (t==VCRoch) if(odkud==e8 && kam==c8) return true; else continue;
  413.   /*Promena bileho pesce*/
  414. if ((t>>12)==12)
  415.  if(odkud==a7+((t>>7)&7) && kam==a8+((t>>4)&7)) return true; else continue;
  416.   /*Promena cerneho pesce*/
  417. if ((t>>12)==13)
  418.  if(odkud==a2+((t>>7)&7) && kam==a1+((t>>4)&7)) return true; else continue;
  419. /* Brani mimochodem (nic jineho to uz byt nemuze)*/
  420. t&=0x3fff; /* odstraneni prvnich dvou bitu, aby se lepe siftovalo*/
  421. if(kam==(t&127) && odkud==(t>>7)) return true; else continue;
  422. } /* konec while cyklu*/
  423.  return false;
  424. }
  425. #if Typ_Produktu==Win32_Program
  426. #include "promdlg.h"
  427. u16 DoplnTah(HWND hwnd,u8 odkud,u8 kam,TUloha *uloha)
  428. /***************************************************/
  429. /* Jen windows - pripadny dialog promeny pesce     */
  430. /***************************************************/ 
  431.  {
  432.  TTah1 *p,*k;
  433.  u16 t;
  434.  
  435.  p=&uloha->zasobnik.tahy[uloha->zasobnik.hranice[uloha->zasobnik.pos]]-1;
  436.  k=&uloha->zasobnik.tahy[uloha->zasobnik.hranice[uloha->zasobnik.pos+1]]-1;
  437.  while(p<k)
  438.   {p++;
  439.    t=p->data;
  440.  /* Normalni tah*/
  441. if(!(t>>15))  if(kam==(t&127) && odkud==(t>>7)) return t; else continue;
  442. /*RoÜßdy*/
  443. if (t==MBRoch) if(odkud==e1 && kam==g1)  return t; else continue;
  444. if (t==VBRoch) if(odkud==e1 && kam==c1)  return t; else continue;
  445. if (t==MCRoch) if(odkud==e8 && kam==g8)  return t; else continue;
  446. if (t==VCRoch) if(odkud==e8 && kam==c8)  return t; else continue;
  447.   /*Promena bileho pesce*/
  448. if ((t>>12)==12)
  449.  if(odkud==a7+((t>>7)&7) && kam==a8+((t>>4)&7))
  450.   return(t&(0xFFFF^(3<<10)))|(DialogPromeny(hwnd,1)<<10);
  451.  else continue;
  452.   /*Promena cerneho pesce*/
  453. if ((t>>12)==13)
  454.  if(odkud==a2+((t>>7)&7) && kam==a1+((t>>4)&7))
  455.   return(t&(0xFFFF^(3<<10)))|(DialogPromeny(hwnd,0)<<10);
  456.  else continue;
  457. /* Brani mimochodem (nic jineho to uz byt nemuze)*/
  458. if(kam==(t&0x3fff&127) && odkud==((t&0x3fff)>>7)) return t; else continue;
  459. } /* konec while cyklu*/
  460.  return 0;
  461.  }
  462. #endif
  463.  
  464. bool stejne(s8 *s1,s8 *s2)
  465. /****************************/
  466. /* jsou 2 Üachovnice stejnΘ */
  467. /****************************/
  468. {int i;
  469.   for (i=a1;i<=h8;i++) if (s1[i]!=s2[i]) return false;
  470.   return true;
  471. }
  472. bool DulezityTah(TPozice *pos,u16 t)
  473. /*********************************************/
  474. /* Pozice je p°ed zahrßnφm tahu t.           */
  475. /* vracφ true - je to tah p∞Ücem nebo branφ  */
  476. /* false - jindy                             */
  477. /*********************************************/
  478.  {
  479.   if (t&(1<<15))
  480.    {
  481.     /* nenormalni tah */
  482.      if (t&(1<<14))
  483.       /* rosada nebo promena pesce*/
  484.       {
  485.        if (t&(1<<13)) return false; else return true;
  486.                      /* rosada else promena pesce*/
  487.       }
  488.      else
  489.      /* brani mimochodem */
  490.       return true;
  491.    }
  492.   else
  493.     /* nenormalni tah */
  494.    {
  495.     if (pos->sch[t&127] || pos->sch[t>>7]==1 || pos->sch[t>>7]==-1) return true;
  496.      else return false;
  497.    }
  498.  }
  499. int Remiza50Nebo3(TUloha *uloha)
  500. /************************************************************************
  501. *  Je remφza 50 tahy nebo 3x stejnß pozice ?                            *
  502. *  vracφ 50, 3 nebo 0 (v²znam je jasn²)                                 *
  503. ************************************************************************/
  504. {int i,stejnych;
  505.  TPozice pos;
  506.  
  507.  stejnych=0;
  508.  pos=uloha->pozice;
  509.  for(i=0;i<100;i++)
  510.   {
  511.    if(!uloha->prt->l) break;
  512.    GlobTahniZpet(uloha);
  513.    if(DulezityTah(&uloha->pozice,uloha->prt->p->data.t)){i++;break;}
  514.    if(stejne(pos.sch,uloha->pozice.sch)&& (i&1))
  515.      if(++stejnych==2){ i++;break;}
  516.    if (i==99) stejnych=49;
  517.   }
  518.  for(;i>0;i--) GlobTahni(false,uloha,false);
  519.  if (stejnych<2)stejnych=0;else stejnych++;
  520.  return stejnych;
  521. }
  522.  
  523.